Lectia 1


Studiu de caz: fie o linie dintr-un tabel
Nume
Prenume
Clasa
telefon
adresa
varsta
Ionescu
Maria
4
0747321234
florilor 3
10
Popescu
Ana
5
0797323234
florilor 4
12
Vasilescu
Maria
9
0748321234
florilor 5
14
Cum se stocheaza in memoria unui calculator o linie a unui tabel?
R: folosind o structura de date, ce poate stoca date diferite

Aceasta structura poarta numele de inregistrare

Dupa cum se poate observa, o inregistrare are mai multe componente, componente ce poarta numele de campuri, fiecare componenta fiind de alt tip,

O inregistrare poate primi un nume care sa defineasca intreaga inregistrare. In exemplul nostru, am putea alege numele “elev” deoarece toate campurile definesc in totalitatea lor “proprietatile” unui elev.

Definitie: O structură este un ansamblu format din una sau mai multe date de tipuri diferite grupate împreună sub un singur nume.
Datele pot fi:
-Date elementare: numerice, caracter(int, long, float, char, double)
Ex: varsta unui elev poate fi un numar intreg, inatimea, un numar real;
-Structuri de date: vectorii numerici, siruri de caractere (structuri omogene), si inregistrarile (structuri neomogene)
Ex: numele unui elev este un sir de caractere, notele unui elev pot fi stocate intr-un vector numeric,

Structurile se deosebesc de tablouri prin următoarele aspecte:
(i) elementele unei structuri pot avea tipuri diferite,
(ii) structurile pot fi atribuite,(iii)funcţiile pot returna structuri,(iv) elementele unui structuri nu sunt variabile anonime ci au câte un nume,(v) referirea unui element al unei structuri se realizează cu operatorul de selecţie ( . ) şi nu cu operatorul de indexare ( [ ] ).
Forma generala a unei structuri

struct[numestructura]
{
[<tip> <numevariabila [, numevariabila, ……]>];
[<tip> <numevariabila [, numevariabila, ……]>];

} [lista de variabile];


Definitia structurii
FORMA 1 DE DECLARARE
definirea structurii este separata de declararea variabilelor separat definite
struct elev{
char nume[20], prenume[20];
float nota_mate,nota_info;
int varsta;
};
elev x,y;

FORMA 2 DE DECLARARE

struct elev{
char nume[20], prenume[20];
float nota_mate, nota_info;
intvarsta;
} x, y;

FORMA 3 DE DECLARARE
structura nu are definit un nume, nu veti putea defini ulterior o alta variabila de memorie cu acest tip; singurele variabile definite sunt x si y.
struct {
char nume[20], prenume[20];
float nota_mate, nota_info;
intvarsta;
} x, y;

Accesarea campurilorFiind data o structura elev definita astfel:
struct elev{
char nume [20], prenume[20];
float nota_mate,nota_info;
int varsta;
} popescu;

Vom accesa elementele inregistrarii, folosind operatorul de acesare directa “.”; Astfel vom avea:

  • popescu.nume reprezinta campul nume al variabilei popescu
  • popescu.nume[0] reprezinta primul caracter din nume
  • popescu.nota_mate reprezinta nota la mate a lui popescu
Observatii:

  • Între două variabile de acelaşi tip struct se poate folosi atribuirea.
  • Dacă inr1, inr2 sunt două variabile de tip elev, prin atribuirea inr1=inr2, variabila inr1 ia aceeaşi valoare ca variabila inr2.
  • O astfel de atribuire se mai numeşte copiere bit cu bit.

Exemplul1: Se citeste si se afiseaza o variabila de tip elev
#include<iostream>
using namespace std;
struct elev{
char nume [20], prenume[20];
float nota_mate,nota_info;
int varsta;
};
main(){
elev inr;
cout<“Nume “;cin.get(inr.nume,20);
cin.get();
cout<<“prenume “;cin.get(inr.prenume,20);
cout<<“nota mate”;cin>>inr.nota_mate;
cout<<“nota info”;cin>>inr.nota_info;
cout<<“varsta”;cin>>inr.varsta;
cout<<“Am citit:”<<endl<< inr.nume<< “ ”<<inr.prenume<<endl<< inr.nota_mate<<endl;
cout<< inr.nota_info<<endl<< inr.varsta;
}


Tema
Cititi o variabila cu urmatoarea structura:
  • —Nume_elev: 30 caractere
  • —Zi: intreg;
  • —Luna : intreg
  • —An: intreg
  • —Nota mate real
  • —Nota info real
  • —Nota engleza real
  • —Media real
OBS!!!!: Media se calculeaza nu se citeste

Lectia 2


In unele cazuri, unul dintre campurile inregistrarii poate fi si el, la randul lui de tip inregistrare.Exemplu- Sa consideram o inregistrare care trebuie sa contina urmatoarele campuri:nume, pren, data_n si salariu, unde data_n este tot de tip inregistrare.
Varianta 1:
struct data{
int zi,luna,an;}
struct persoana{
char nume[30],prenume[30];
data data_n;}
Varianta 2:
struct persoana{
char nume[30],prenume[30];
struct{int zi,an,luna} data_n;
};
Exemplu de accesarea campurilor:
persoana p; //se declara variabila p de tip persoana
p.nume - campul nume din structura persoana
p.data_n.an - campul an din data nasterii
p.data_n.luna - campul luna din data nasterii
p.data_n.zi - campul zi din data nasterii
Problema: Se citesc de la tastatura coordonatele a doua segmente care reprezinta laturile unui dreptunghi(latimea,lungimea). Sa i se calculeze diagonala.

Lectia 3


Vectori de inregistrari
Problema 1: Fie urmatoarea structura:
  • Nume: 30 caractere
  • Inaltime: numar real
  • Greutate: numar intreg
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine a alfabetica a numelui, fiecare inregistrare pe cate o linie:
Ex: n=2
Ionescu 1.62 70
Antonescu 1.72 80
Se vorafisa:
Antonescu 1.72 80
Ionescu 1.62 70
Rezolvare
#include<fstream>
#include<string.h>//cstring
using namespace std;
structelev{
char nume[31];
float h;
int g;} v[10],aux;
int main(){
intn,i,j,x;
ifstream fin("date.in");
ofstreamfout("date.out");
fin>>n;
for(i=0; i<n; i++){
fin>>v[i].nume;
fin>>v[i].h;
fin>>v[i].g; }
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
x=strcmp(v[i].nume,v[j].nume);
if(x>0) {
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
}
for(i=0;i<n;i++){
fout<<v[i].nume<<" "<<v[i].h<<" "<<v[i].g<<endl;
}
return 0;
}

Problema 2: Fie urmatoarea structura:
  • Nume: 30 caractere
  • Prenume: 30 caractere
  • Inaltime: numar real
  • Greutate: numar intreg
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul inaltime, fiecare inregistrare pe cate o linie:
Ex: n=2
IonescuVlad 1.62 70
AntonescuCiprian 1.72 80
Se vorafisa:
AntonescuCiprian 1.72 80
IonescuVlad 1.62 70
Problema 3: Fie urmatoarea structura:
  • Nume: 30 caractere
  • Prenume: 30 caractere
  • medie: numar real
  • Nota1,nota2: numere intregi
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul medie, fiecare inregistrare pe cate o linie:
Ex: n=2
AntonescuCiprian 8.50 8 9
IonescuVlad 9.50 10 9

Se vorafisa:
IonescuVlad 9.50 10 9
AntonescuCiprian 8.50 8 9

MATERIALE:
-Structuri